package com.platform.common.utils;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

import org.apache.commons.io.IOUtils;

/**
 * <pre>
 * 功能：文件操作工具类
 * </pre>
 * 
 * @author wei.gao
 */
public class FileUtils extends org.apache.commons.io.FileUtils {
	
	/**
	 * <pre>
	 * 功能：获得去除扩展名的文件名
	 * </pre>
	 * 
	 * @param oldFilename
	 * @return
	 */
	public static String removeExtension(String oldFilename) {
		final File oldFile = new File(oldFilename);
		final int iExtPos = oldFile.getName().lastIndexOf('.');
		if (iExtPos != -1) {
			final String parentPath = oldFilename.substring(0, oldFilename.length() - oldFile.getName().length());
			return parentPath + oldFile.getName().substring(0, iExtPos);
		}
		return oldFilename;
	}
	
	/**
	 * <pre>
	 * 功能：返回文件名(比如abc.jpg)
	 * </pre>
	 * 
	 * @param path
	 * @return
	 */
	public static String getFileName(String path) {
		if (StringUtils.isBlank(path)) {
			return null;
		}
		final int p = path.lastIndexOf(File.separatorChar);
		if (p != -1) {
			return path.substring(p + 1);
		} else {
			return "";
		}
	}
	
	/**
	 * <pre>
	 * 功能：返回文件名,取文件地址前缀
	 * </pre>
	 * 
	 * @param file
	 * @param prefixDir
	 * @return
	 */
	public static String getFileName(File file, File prefixDir) {
		if (file == null) {
			return null;
		}
		if (prefixDir == null) {
			return file.getName();
		} else {
			return StringUtils.substring(file.getPath(), prefixDir.getPath().length() + 1, 0xFFFF);
		}
	}
	
	/**
	 * <pre>
	 * 功能：返回文件所在目录
	 * </pre>
	 * 
	 * @param path
	 * @return
	 */
	public static String getFileDirectory(String path) {
		if (StringUtils.isBlank(path)) {
			return null;
		}
		final int p = path.lastIndexOf(File.separatorChar);
		if (p != -1) {
			return path.substring(0, p);
		} else {
			return "";
		}
	}
	
	/**
	 * <pre>
	 * 功能：更改扩展名
	 * </pre>
	 * 
	 * @param oldFilename
	 * @param newExtension
	 * @return
	 */
	public static String changeExtension(String oldFilename, String newExtension) {
		String result = removeExtension(oldFilename);
		if (newExtension.length() != 0) {
			result = StringUtils.concat(result, ".", newExtension);
		}
		return result;
	}
	
	/**
	 * <pre>
	 * 功能：获得文件扩展名
	 * </pre>
	 * 
	 * @param file
	 * @return
	 */
	public static String getExtension(File file) {
		final int ipos = file.getName().lastIndexOf(".");
		if (ipos != -1) {
			return file.getName().substring(ipos + 1);
		} else {
			return StringUtils.EMPTY_STRING;
		}
	}
	
	/**
	 * <pre>
	 * 功能：获得文件的扩展名
	 * </pre>
	 * 
	 * @param fileName
	 * @return
	 */
	public static String getExtension(String fileName) {
		if (ValidateUtils.isNull(fileName)) {
			return StringUtils.EMPTY_STRING;
		}
		return fileName.substring(fileName.lastIndexOf(".") + 1);
	}
	
	/**
	 * <pre>
	 * 功能：获得临时文件的文件名
	 * </pre>
	 * 
	 * @return
	 */
	public static String getTempFileName() {
		return IdentitiesUtils.uuid2() + ".tmp";
	}
	
	/**
	 * <pre>
	 * 功能：获得文件夹中的文件列表
	 * </pre>
	 * 
	 * @param directory
	 * @return
	 */
	public static List<File> getFiles(File directory) {
		return getFiles(directory, null);
	}
	
	/**
	 * <pre>
	 * 功能：获得文件夹中的指定规则的文件列表
	 * </pre>
	 * 
	 * @param directory
	 * @param regex
	 * @return
	 */
	public static List<File> getFiles(File directory, String regex) {
		if (!directory.isDirectory())
			return Collections.emptyList();
		List<File> result = new ArrayList<File>();
		File[] files = directory.listFiles();
		for (int i = 0; i < files.length; i++) {
			if (files[i].isFile() && (ValidateUtils.isNull(regex) || ValidateUtils.isRegex(files[i].getName(), regex))) {
				result.add(files[i]);
			} else if (files[i].isDirectory()) {
				result.addAll(getFiles(files[i], regex));
			}
		}
		return result;
	}
	
	/**
	 * <pre>
	 * 功能：获得文件大小
	 * </pre>
	 * 
	 * @param f
	 * @return
	 */
	public static long getFileSize(File f) {
		if (f == null || !f.exists()) {
			return 0;
		}
		long s = 0;
		FileInputStream fis = null;
		try {
			fis = new FileInputStream(f);
			s = fis.available();
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			IOUtils.closeQuietly(fis);
		}
		return s;
	}
	
	/**
	 * <pre>
	 * 功能：获得文件的KB大小
	 * </pre>
	 * 
	 * @param f
	 * @return
	 */
	public static BigDecimal getKBFileSize(File f) {
		return BigDecimal.valueOf(getFileSize(f)).divide(BigDecimal.valueOf(1024)).setScale(2, BigDecimal.ROUND_HALF_UP);
	}
	
	/**
	 * <pre>
	 * 功能：获得文件的MB大小
	 * </pre>
	 * 
	 * @param f
	 * @return
	 */
	public static BigDecimal getMBFileSize(File f) {
		return getKBFileSize(f).divide(BigDecimal.valueOf(1024)).setScale(2, BigDecimal.ROUND_HALF_UP);
	}
	
	/**
	 * <pre>
	 * 功能：获得友好的文件大小
	 * </pre>
	 * 
	 * @param file
	 * @return
	 */
	public static String getFriendlyFileSize(File file) {
		long size = getFileSize(file);
		if (size < 1024) {
			return StringUtils.concat(BigDecimal.valueOf(size).setScale(2, BigDecimal.ROUND_HALF_UP), "B");
		} else if (size < 1024 * 1024) {
			return StringUtils.concat(BigDecimal.valueOf(size).divide(BigDecimal.valueOf(1024)).setScale(2, BigDecimal.ROUND_HALF_UP), "KB");
		} else if (size < 1024 * 1024 * 1024) {
			return StringUtils.concat(BigDecimal.valueOf(size).divide(BigDecimal.valueOf(1024)).divide(BigDecimal.valueOf(1024)).setScale(2, BigDecimal.ROUND_HALF_UP), "MB");
		} else {
			return StringUtils.concat(BigDecimal.valueOf(size).divide(BigDecimal.valueOf(1024)).divide(BigDecimal.valueOf(1024)).divide(BigDecimal.valueOf(1024)).setScale(2, BigDecimal.ROUND_HALF_UP), "GB");
		}
	}
	
	/**
	 * <pre>
	 * 功能：获得文本的行数
	 * </pre>
	 * 
	 * @param file
	 * @return
	 */
	public static int getFileLines(File file) {
		int lines = 0;
		if (file.canRead()) {
			BufferedReader br = null;
			try {
				br = new BufferedReader(new FileReader(file));
				while (br.readLine() != null) {
					lines++;
				}
				br.close();
			} catch (FileNotFoundException e) {
				e.printStackTrace();
			} catch (IOException e) {
				e.printStackTrace();
			} finally {
				IOUtils.closeQuietly(br);
			}
		}
		return lines;
	}
}
